home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 25 / CU Amiga Magazine's Super CD-ROM 25 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-08].iso / CUCD / Online / MagPLIP / source / track.c < prev   
C/C++ Source or Header  |  1996-04-09  |  4KB  |  169 lines

  1. /*
  2. ** $VER: track.c 1.5 (09 Apr 1996)
  3. **
  4. ** magplip.device - Parallel Line Internet Protocol
  5. **
  6. ** Original code written by Oliver Wagner and Michael Balzer.
  7. **
  8. ** This version has been completely reworked by Marius Gröger,
  9. ** introducing slight protocol changes. The new source is
  10. ** a lot better organized and maintainable.
  11. **
  12. ** (C) Copyright 1993-1994 Oliver Wagner & Michael Balzer
  13. ** (C) Copyright 1995 Jan Kratochvil & Martin Mares
  14. ** (C) Copyright 1995-1996 Marius Gröger
  15. **     All Rights Reserved
  16. **
  17. ** $HISTORY:
  18. **
  19. ** 09 Apr 1996 : 001.005 :  now multiple users may track one type
  20. ** 29 Mar 1996 : 001.004 :  changed copyright note
  21. ** 30 Aug 1995 : 001.003 :  minor declaration related changes
  22. ** 05 Mar 1995 : 001.001 :  couldn't any longer stand the original, unstructured code
  23. ** 12 Feb 1995 : 001.000 :  reworked original
  24. */
  25.  
  26. /*F*/ /* includes */
  27. #ifndef CLIB_EXEC_PROTOS_H
  28. #include <clib/exec_protos.h>
  29. #include <pragmas/exec_sysbase_pragmas.h>
  30. #endif
  31.  
  32. #ifndef EXEC_MEMORY_H
  33. #include <exec/memory.h>
  34. #endif
  35. #ifndef EXEC_LISTS_H
  36. #include <exec/lists.h>
  37. #endif
  38. #ifndef EXEC_NODES_H
  39. #include <exec/nodes.h>
  40. #endif
  41.  
  42. #ifndef _STRING_H
  43. #include <string.h>
  44. #endif
  45.  
  46. #ifndef __MAGPLIP_H
  47. #include "magplip.h"
  48. #endif
  49.  
  50. #ifndef __DEBUG_H
  51. #include "debug.h"
  52. #endif
  53.  
  54. /*E*/
  55. /*F*/ /* exports */
  56. PUBLIC BOOL addtracktype(BASEPTR, ULONG type);
  57. PUBLIC BOOL remtracktype(BASEPTR, ULONG type);
  58. PUBLIC VOID dotracktype(BASEPTR, ULONG type, ULONG ps, ULONG pr, ULONG bs, ULONG br, ULONG pd);
  59. PUBLIC BOOL gettrackrec(BASEPTR, ULONG type, APTR info);
  60. PUBLIC VOID freetracktypes(BASEPTR);
  61. /*E*/
  62. /*F*/ /* private */
  63. PRIVATE struct TrackRec *findtracktype(BASEPTR, ULONG type);
  64. /*E*/
  65.  
  66. /*F*/ PRIVATE INLINE struct TrackRec *findtracktype(BASEPTR, ULONG type)
  67. {
  68.    struct TrackRec * tr;
  69.  
  70.    for (tr = (struct TrackRec *) pb->pb_TrackList.lh_Head; tr->tr_Link.mln_Succ;
  71.                                                       tr = (struct TrackRec *) tr->tr_Link.mln_Succ)
  72.    {
  73.       if( tr->tr_PacketType == type )
  74.          return( tr );
  75.    }
  76.  
  77.    return( NULL );
  78. }
  79. /*E*/
  80. /*F*/ PUBLIC BOOL addtracktype(BASEPTR, ULONG type)
  81. {
  82.    struct TrackRec *tr;
  83.    BOOL rv = FALSE;
  84.  
  85.    ObtainSemaphore(&pb->pb_TrackListSem);
  86.    if (!(tr = findtracktype(pb, type)))
  87.    {
  88.       if (tr = AllocVec(sizeof(*tr), MEMF_CLEAR))
  89.       {
  90.          tr->tr_Count = 1;
  91.          tr->tr_PacketType = type;
  92.          AddTail((struct List*)&pb->pb_TrackList, (struct Node *)tr);
  93.          rv = TRUE;
  94.       }
  95.    }
  96.    else
  97.    {
  98.       ++tr->tr_Count;
  99.       rv = TRUE;
  100.    }
  101.    ReleaseSemaphore(&pb->pb_TrackListSem);
  102.  
  103.    return rv;
  104. }
  105. /*E*/
  106. /*F*/ PUBLIC BOOL remtracktype(BASEPTR, ULONG type)
  107. {
  108.    struct TrackRec *tr;
  109.    BOOL rv = FALSE;
  110.  
  111.    ObtainSemaphore( &pb->pb_TrackListSem );
  112.    if (tr = findtracktype(pb, type))
  113.    {
  114.       if (!(--tr->tr_Count))
  115.       {
  116.          Remove((struct Node *)tr);
  117.          FreeVec(tr);
  118.       }
  119.       rv = TRUE;
  120.    }
  121.    ReleaseSemaphore( &pb->pb_TrackListSem );
  122.  
  123.    return rv;
  124. }
  125. /*E*/
  126. /*F*/ PUBLIC VOID dotracktype(BASEPTR, ULONG type, ULONG ps, ULONG pr, ULONG bs, ULONG br, ULONG pd)
  127. {
  128.    struct TrackRec * tr;
  129.  
  130.    ObtainSemaphore(&pb->pb_TrackListSem);
  131.    if (tr = findtracktype(pb, type))
  132.    {
  133.       tr->tr_Sana2PacketTypeStats.PacketsSent += ps;
  134.       tr->tr_Sana2PacketTypeStats.PacketsReceived += pr;
  135.       tr->tr_Sana2PacketTypeStats.BytesSent += bs;
  136.       tr->tr_Sana2PacketTypeStats.BytesReceived += br;
  137.       tr->tr_Sana2PacketTypeStats.PacketsDropped += pd;
  138.    }
  139.    ReleaseSemaphore(&pb->pb_TrackListSem);
  140. }
  141. /*E*/
  142. /*F*/ PUBLIC BOOL gettrackrec(BASEPTR, ULONG type, struct Sana2PacketTypeStats *info)
  143. {
  144.    struct TrackRec * tr;
  145.    BOOL rv = FALSE;
  146.  
  147.    ObtainSemaphoreShared( &pb->pb_TrackListSem );
  148.    if (tr = findtracktype(pb, type))
  149.    {
  150.       *info = tr->tr_Sana2PacketTypeStats;
  151.       rv = TRUE;
  152.    }
  153.    ReleaseSemaphore( &pb->pb_TrackListSem );
  154.  
  155.    return rv;
  156. }
  157. /*E*/
  158. /*F*/ PUBLIC VOID freetracktypes(BASEPTR)
  159. {
  160.    struct Node *tr;
  161.  
  162.    ObtainSemaphore(&pb->pb_TrackListSem);
  163.    while(tr = RemHead((struct List*)&pb->pb_TrackList))
  164.       FreeVec(tr);
  165.    ReleaseSemaphore(&pb->pb_TrackListSem);
  166. }
  167. /*E*/
  168.  
  169.